package com.hot12345.database;

import java.util.List;
import java.util.Map;

public interface BaseDao<T> {

	public static final String PRE_INSERT = "insert";

	public static final String PRE_UPDATE = "update";

	public static final String PRE_DELETE = "delete";
	
	public static final String PRE_DELETE_BY_PARAMS = "deleteByParams";

	public static final String PRE_FIND = "find";
	
	public static final String PRE_FIND_VO = "findVO";
	
	public static final String PRE_UPDATE_BY_PARAMS = "updateByParams";
	
	public static final String PRE_FIND_COUNT = "findCount";
	
	
	public static final String PRE_INSERT_HISTORY = "insertHistory";
	
	/**
	 * 根据主键返回唯一对象,可指定数据源。
	 * @param dsAlias 数据源别名
	 * @param id 序列主键
	 * @return 实体对象
	 */
	public T findByPrimaryKey(Integer id)  throws Exception;
	
	/**
	 * 根据主键返回唯一对象,可指定数据源。
	 * @param dsAlias 数据源别名
	 * @param id 序列主键
	 * @return 实体对象
	 */
	public T findByPrimaryKey(Long id)  throws Exception;
	
	/**
	 * 根据主键数组返回一批对象
	 * @param ids 序列主键数组
	 * @return 实体对象链表
	 */
	public List<T> findByPrimaryKeys(Integer[] ids) throws Exception;
	
	/**
	 * 根据参数返回一个实体对象，一般用于查询具有唯一约束条件的记录
	 * 必须保证传入的参数确实能定位唯一一个对象，否则将iBatis会抛出运行异常
	 * @param ds 数据源别名
	 * @param params 参数Map对象
	 * @return 实体对象 
	 */
	public T findUniqueByParams(Map<String, Object> params) throws Exception;
	
	/**
	 * 根据参数返回实体对象集合
	 * @param params 参数Map对象
	 * @param ds 数据源别名
	 * @return 实体对象链表
	 */
	public List<T> findByParams(Map<String, Object> params)  throws Exception;
	
	/**
	 * 分页,根据参数返回实体对象集合
	 * @param params 参数Map对象
	 * @param ds 数据源别名
	 * @param pageNo 起始数(按每页10条算，第一页为0,第二页为10,第三页为20)
	 * @param limit 每页数量(每页显示多少条记录)
	 * @return 实体对象链表
	 */
	public List<T> findByParamsPage(Map<String, Object> params,int pageNo,int limit)  throws Exception;
	
	/**
	 * 创建实体对象
	 * @param 数据源
	 * @param entity
	 * @return Integer
	 */
	public Integer insert(T entity)  throws Exception;
	
	/**
	 * 创建实体对象,返回的id值为long类型
	 * @param 数据源
	 * @param entity
	 * @return Long
	 */
	public Long insertL(T entity)  throws Exception;
	/**
	 * 更新实体对象
	 * @param ds 数据源
	 * @param entity
	 */
	public int update(T entity) throws Exception;
	
	/**
	 * 删除实体对象
	 * @param ds 数据源
	 * @param entity
	 */
	public Integer delete(T entity) throws Exception;
	
	/**
	 * 按照Map参数进行条件删除
	 * @param ds 数据源
	 * @param params
	 */
	public Integer deleteByParams(Map<String,Object> params) throws Exception;
	
	/**
	 * 根据主键删除实体对象
	 * @param ds 数据源
	 * @param id 主键ID
	 */
	public Integer deleteByPrimaryKey(Integer id) throws Exception;
	
	/**
	 * 默认的find SQL分页
	 * @param ds
	 * @param params
	 * @return long
	 * @throws Exception
	 */
	public long findCount(Map<String,Object> params) throws Exception;
	
	/**
	 * 更新收藏数
	 */
	public int updateFavorites(int id) throws Exception;
	
	/**
	 * 更新点击数
	 */
	public int updateClickNum(int id) throws Exception;
}
